<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<script src="../resources/js-test.js"></script>
</head>
<body>
<div id="description"></div>
<div id="console"></div>

<script>

description("This test exercises the CSSMatrix interface");

debug("");
debug("CSSMatrix constructors");


var m = new WebKitCSSMatrix();
shouldBeNonNull('m');
shouldBeNonNull('new WebKitCSSMatrix()');
shouldBeNonNull('new WebKitCSSMatrix(m)');
shouldBeNonNull('new WebKitCSSMatrix("matrix(1, 0, 0, 1, 0, 0)")');
shouldBeNonNull('new WebKitCSSMatrix("")');
shouldBeNonNull('new WebKitCSSMatrix("none")');
shouldBeNonNull('new WebKitCSSMatrix("   none   ")');

debug("");
debug("Test toString");
var m = new WebKitCSSMatrix("matrix(1, 0, 0, 1, 0, 0)");
var s = m.toString();
var a = s.split('(');
shouldBe('a[0]', '"matrix"');
var a2 = a[1].split(',');
shouldBe('parseFloat(a2[0])', '1');
shouldBe('parseFloat(a2[1])', '0');
shouldBe('parseFloat(a2[2])', '0');
shouldBe('parseFloat(a2[3])', '1');
shouldBe('parseFloat(a2[4])', '0');
var a3 = a2[5].split(")");
shouldBe('parseFloat(a3[0])', '0');
shouldBe('a3[1]', '""');

debug("");
debug("Test bad input to string constructor");
shouldThrow('new WebKitCSSMatrix("banana")');

debug("");
debug("Test attributes on default matrix");
m = new WebKitCSSMatrix();
shouldBe('m.a', '1');
shouldBe('m.b', '0');
shouldBe('m.c', '0');
shouldBe('m.d', '1');
shouldBe('m.e', '0');
shouldBe('m.f', '0');

debug("");
debug("Test attributes on custom matrix");
m = new WebKitCSSMatrix("matrix(11, 12, 21, 22, 41, 42)");
shouldBe('m.a', '11');
shouldBe('m.b', '12');
shouldBe('m.c', '21');
shouldBe('m.d', '22');
shouldBe('m.e', '41');
shouldBe('m.f', '42');

debug("");
debug("Test setMatrixValue - set to matrix()");
m = new WebKitCSSMatrix();
m.setMatrixValue("matrix(11, 12, 21, 22, 41, 42)");
shouldBe('m.a', '11');
shouldBe('m.b', '12');
shouldBe('m.c', '21');
shouldBe('m.d', '22');
shouldBe('m.e', '41');
shouldBe('m.f', '42');

debug("");
debug("Test setMatrixValue - set to translate(10px, 20px) scale(2, 3)");
m = new WebKitCSSMatrix();
m.setMatrixValue("translate(10px, 20px) scale(2, 3)");
shouldBe('m.a', '2');
shouldBe('m.b', '0');
shouldBe('m.c', '0');
shouldBe('m.d', '3');
shouldBe('m.e', '10');
shouldBe('m.f', '20');

debug("");
debug("Test throwing exception from setMatrixValue");
shouldThrow('m.setMatrixValue("banana")');
shouldThrow('m.setMatrixValue("translate(10em, 20%)")');
shouldThrow('m.setMatrixValue("translate(10px, 20px) scale()")');

debug("");
debug("Test attributes on translate() and accumulation");
m = new WebKitCSSMatrix();
var m2 = m.translate(50,0);
m2 = m2.translate(50,50);
shouldBe('m2.a', '1');
shouldBe('m2.b', '0');
shouldBe('m2.c', '0');
shouldBe('m2.d', '1');
shouldBe('m2.e', '100');
shouldBe('m2.f', '50');

debug("");
debug("Test immutability of translate");
shouldBe('parseFloat(m.a)', '1');
shouldBe('parseFloat(m.b)', '0');
shouldBe('parseFloat(m.c)', '0');
shouldBe('parseFloat(m.d)', '1');
shouldBe('parseFloat(m.e)', '0');
shouldBe('parseFloat(m.f)', '0');

debug("");
debug("Test attributes on scale()");
var m3 = m2.scale(5);
shouldBe('m3.a', '5');
shouldBe('m3.b', '0');
shouldBe('m3.c', '0');
shouldBe('m3.d', '5');
shouldBe('m3.e', '100');
shouldBe('m3.f', '50');

debug("");
debug("Test immutability of scale()");
shouldBe('parseFloat(m2.a)', '1');
shouldBe('parseFloat(m2.b)', '0');
shouldBe('parseFloat(m2.c)', '0');
shouldBe('parseFloat(m2.d)', '1');
shouldBe('parseFloat(m2.e)', '100');
shouldBe('parseFloat(m2.f)', '50');

debug("");
debug("Test attributes on non-uniform scale()");
var m4 = m3.scale(2,1);
shouldBe('m4.a', '10');
shouldBe('m4.b', '0');
shouldBe('m4.c', '0');
shouldBe('m4.d', '5');
shouldBe('m4.e', '100');
shouldBe('m4.f', '50');

debug("");
debug("Test immutability of non-uniform scale()");
shouldBe('parseFloat(m3.a)', '5');
shouldBe('parseFloat(m3.b)', '0');
shouldBe('parseFloat(m3.c)', '0');
shouldBe('parseFloat(m3.d)', '5');
shouldBe('parseFloat(m3.e)', '100');
shouldBe('parseFloat(m3.f)', '50');

debug("");
debug("Test rotate");
m = new WebKitCSSMatrix();
m2 = m.rotate(10);
shouldBe('parseFloat(m2.a.toPrecision(6))', '0.984808');
shouldBe('parseFloat(m2.b.toPrecision(6))', '0.173648');
shouldBe('parseFloat(m2.c.toPrecision(6))', '-0.173648');
shouldBe('parseFloat(m2.d.toPrecision(6))', '0.984808');
shouldBe('m.e', '0');
shouldBe('m.f', '0');

debug("");
debug("Test immutability of rotate");
shouldBe('parseFloat(m.a)', '1');
shouldBe('parseFloat(m.b)', '0');
shouldBe('parseFloat(m.c)', '0');
shouldBe('parseFloat(m.d)', '1');
shouldBe('parseFloat(m.e)', '0');
shouldBe('parseFloat(m.f)', '0');

debug("");
debug("Test skew in horizontal direction");
m = new WebKitCSSMatrix();
m2 = m.skewX(10);
shouldBe('parseFloat(m2.a)', '1');
shouldBe('parseFloat(m2.b)', '0');
shouldBe('parseFloat(m2.c.toPrecision(6))', '0.176327');
shouldBe('parseFloat(m2.d)', '1');
shouldBe('parseFloat(m2.e)', '0');
shouldBe('parseFloat(m2.f)', '0');

debug("");
debug("Test immutability of horizontal skew");
shouldBe('parseFloat(m.a)', '1');
shouldBe('parseFloat(m.b)', '0');
shouldBe('parseFloat(m.c)', '0');
shouldBe('parseFloat(m.d)', '1');
shouldBe('parseFloat(m.e)', '0');
shouldBe('parseFloat(m.f)', '0');

debug("");
debug("Test skew in vertical direction");
m = new WebKitCSSMatrix();
m2 = m.skewY(35);
shouldBe('parseFloat(m2.a)', '1');
shouldBe('parseFloat(m2.b.toPrecision(6))', '0.700208');
shouldBe('parseFloat(m2.c)', '0');
shouldBe('parseFloat(m2.d)', '1');
shouldBe('parseFloat(m2.e)', '0');
shouldBe('parseFloat(m2.f)', '0');

debug("");
debug("Test immutability of vertical skew");
shouldBe('parseFloat(m.a)', '1');
shouldBe('parseFloat(m.b)', '0');
shouldBe('parseFloat(m.c)', '0');
shouldBe('parseFloat(m.d)', '1');
shouldBe('parseFloat(m.e)', '0');
shouldBe('parseFloat(m.f)', '0');

debug("");
debug("Test multiply");
m = new WebKitCSSMatrix("matrix(1, 2, 3, 4, 5, 6)");
m2 = new WebKitCSSMatrix("matrix(7, 8, 9, 10, 11, 12)");
var m3 = m.multiply(m2);
shouldBe('parseFloat(m3.a)', '31');
shouldBe('parseFloat(m3.b)', '46');
shouldBe('parseFloat(m3.c)', '39');
shouldBe('parseFloat(m3.d)', '58');
shouldBe('parseFloat(m3.e)', '52');
shouldBe('parseFloat(m3.f)', '76');

debug("");
debug("Test that multiply works in the right direction");
var tx = new WebKitCSSMatrix();
var sx = new WebKitCSSMatrix();
tx = tx.translate(100,0);
sx = sx.scale(2,1);
m = tx.multiply(sx);
shouldBe('m.a', '2');
shouldBe('m.b', '0');
shouldBe('m.c', '0');
shouldBe('m.d', '1');
shouldBe('m.e', '100');
shouldBe('m.f', '0');

debug("")
debug("Test immutability of multiply");
shouldBe('tx.a', '1');
shouldBe('tx.b', '0');
shouldBe('tx.c', '0');
shouldBe('tx.d', '1');
shouldBe('tx.e', '100');
shouldBe('tx.f', '0');
shouldBe('sx.a', '2');
shouldBe('sx.b', '0');
shouldBe('sx.c', '0');
shouldBe('sx.d', '1');
shouldBe('sx.e', '0');
shouldBe('sx.f', '0');

debug("");
debug("Test multiply with missing argument");
m = new WebKitCSSMatrix("matrix(1, 2, 3, 4, 5, 6)");
m2 = m.multiply();
shouldBe('m2.a', '1');
shouldBe('m2.b', '2');
shouldBe('m2.c', '3');
shouldBe('m2.d', '4');
shouldBe('m2.e', '5');
shouldBe('m2.f', '6');

debug("");
debug("Test inverse");
m = new WebKitCSSMatrix("matrix(2, 0, 0, 2, 10, 20)");
m2 = m.inverse();

shouldBe('parseFloat(m2.a)', '0.5');
shouldBe('parseFloat(m2.b)', '0');
shouldBe('parseFloat(m2.c)', '0');
shouldBe('parseFloat(m2.d)', '0.5');
shouldBe('parseFloat(m2.e)', '-5');
shouldBe('parseFloat(m2.f)', '-10');

debug("");
debug("Test immutability of inverse");
shouldBe('parseFloat(m.a)', '2');
shouldBe('parseFloat(m.b)', '0');
shouldBe('parseFloat(m.c)', '0');
shouldBe('parseFloat(m.d)', '2');
shouldBe('parseFloat(m.e)', '10');
shouldBe('parseFloat(m.f)', '20');

debug("");
debug("Test not invertible matrix");
m = new WebKitCSSMatrix("matrix(0, 0, 0, 0, 0, 0)"); // not invertible
m2 = m.inverse();

shouldBeNaN('m2.a');
shouldBeNaN('m2.b');
shouldBeNaN('m2.c');
shouldBeNaN('m2.d');
shouldBeNaN('m2.e');
shouldBeNaN('m2.f');

debug("");
debug("Test immutability of inverse");
shouldBe('m.a', '0');
shouldBe('m.b', '0');
shouldBe('m.c', '0');
shouldBe('m.d', '0');
shouldBe('m.e', '0');
shouldBe('m.f', '0');

debug("");

</script>

<script>
</script>

</body>
</html>
